﻿/***************************************************************
 * 开发人员：网魂小兵@http://www.mozlite.com
 * 
 * 目标标本：4.0.30319.239
 * 
 * 最后修改：2011/12/18 12:21:58
 * ************************************************************/
namespace Mozlite.Web
{
    using System;
    using System.Linq;
    using System.Text;
    using System.Collections.Generic;
    using System.Web.Routing;
    using System.Web.Mvc;
    using System.Text.RegularExpressions;
    using System.Web;

    /// <summary>
    /// 域名注册路由。
    /// </summary>
    public class DomainRoute : System.Web.Routing.Route
    {
        /// <summary>
        /// 使用指定的 URL 模式、默认参数值、约束、自定义值和处理程序类初始化<see cref="T:Mozlite.Web.DomainRoute"/>类的新实例。
        /// </summary>
        /// <param name="domain">域名地址。</param>
        /// <param name="url">路由的 URL 模式。</param>
        /// <param name="routeHandler">处理路由请求的对象。</param>
        public DomainRoute(string domain, string url, IRouteHandler routeHandler = null)
            : base(url, routeHandler ?? new MvcRouteHandler())
        {
            this.Domain = domain;
        }
        /// <summary>
        /// 使用指定的 URL 模式、默认参数值、约束、自定义值和处理程序类初始化<see cref="T:Mozlite.Web.DomainRoute"/>类的新实例。
        /// </summary>
        /// <param name="domain">域名地址。</param>
        /// <param name="url">路由的 URL 模式。</param>
        /// <param name="defaults">要在 URL 不包含所有参数时使用的值。</param>
        /// <param name="routeHandler">处理路由请求的对象。</param>
        public DomainRoute(string domain, string url, RouteValueDictionary defaults, IRouteHandler routeHandler = null)
            : base(url, defaults, routeHandler ?? new MvcRouteHandler())
        {
            this.Domain = domain;
        }
        /// <summary>
        /// 使用指定的 URL 模式、默认参数值、约束、自定义值和处理程序类初始化<see cref="T:Mozlite.Web.DomainRoute"/>类的新实例。
        /// </summary>
        /// <param name="domain">域名地址。</param>
        /// <param name="url">路由的 URL 模式。</param>
        /// <param name="defaults">要在 URL 不包含所有参数时使用的值。</param>
        /// <param name="constraints">一个用于指定 URL 参数的有效值的正则表达式。</param>
        /// <param name="routeHandler">处理路由请求的对象。</param>
        public DomainRoute(string domain, string url, RouteValueDictionary defaults, RouteValueDictionary constraints, IRouteHandler routeHandler = null)
            : base(url, defaults, constraints, routeHandler ?? new MvcRouteHandler())
        {
            this.Domain = domain;
        }
        /// <summary>
        /// 使用指定的 URL 模式、默认参数值、约束、自定义值和处理程序类初始化<see cref="T:Mozlite.Web.DomainRoute"/>类的新实例。
        /// </summary>
        /// <param name="domain">域名地址。</param>
        /// <param name="url">路由的 URL 模式。</param>
        /// <param name="defaults">要在 URL 不包含所有参数时使用的值。</param>
        /// <param name="constraints">一个用于指定 URL 参数的有效值的正则表达式。</param>
        /// <param name="dataTokens">传递到路由处理程序但未用于确定该路由是否匹配特定 URL 模式的自定义值。这些值会传递到路由处理程序，以便用于处理请求。</param>
        /// <param name="routeHandler">处理路由请求的对象。</param>
        public DomainRoute(string domain, string url, RouteValueDictionary defaults, RouteValueDictionary constraints, RouteValueDictionary dataTokens, IRouteHandler routeHandler = null)
            : base(url, defaults, constraints, dataTokens, routeHandler ?? new MvcRouteHandler())
        {
            this.Domain = domain;
        }
        /// <summary>
        /// 使用指定的 URL 模式、默认参数值、约束、自定义值和处理程序类初始化<see cref="T:Mozlite.Web.DomainRoute"/>类的新实例。
        /// </summary>
        /// <param name="domain">域名地址。</param>
        /// <param name="url">路由的 URL 模式。</param>
        /// <param name="defaults">要在 URL 不包含所有参数时使用的值。</param>
        /// <param name="routeHandler">处理路由请求的对象。</param>
        public DomainRoute(string domain, string url, object defaults, IRouteHandler routeHandler = null)
            : base(url, new RouteValueDictionary(defaults), routeHandler ?? new MvcRouteHandler())
        {
            this.Domain = domain;
        }
        /// <summary>
        /// 使用指定的 URL 模式、默认参数值、约束、自定义值和处理程序类初始化<see cref="T:Mozlite.Web.DomainRoute"/>类的新实例。
        /// </summary>
        /// <param name="domain">域名地址。</param>
        /// <param name="url">路由的 URL 模式。</param>
        /// <param name="defaults">要在 URL 不包含所有参数时使用的值。</param>
        /// <param name="constraints">一个用于指定 URL 参数的有效值的正则表达式。</param>
        /// <param name="routeHandler">处理路由请求的对象。</param>
        public DomainRoute(string domain, string url, object defaults, RouteValueDictionary constraints, IRouteHandler routeHandler = null)
            : base(url, new RouteValueDictionary(defaults), constraints, routeHandler ?? new MvcRouteHandler())
        {
            this.Domain = domain;
        }
        /// <summary>
        /// 使用指定的 URL 模式、默认参数值、约束、自定义值和处理程序类初始化<see cref="T:Mozlite.Web.DomainRoute"/>类的新实例。
        /// </summary>
        /// <param name="domain">域名地址。</param>
        /// <param name="url">路由的 URL 模式。</param>
        /// <param name="defaults">要在 URL 不包含所有参数时使用的值。</param>
        /// <param name="constraints">一个用于指定 URL 参数的有效值的正则表达式。</param>
        /// <param name="dataTokens">传递到路由处理程序但未用于确定该路由是否匹配特定 URL 模式的自定义值。这些值会传递到路由处理程序，以便用于处理请求。</param>
        /// <param name="routeHandler">处理路由请求的对象。</param>
        public DomainRoute(string domain, string url, object defaults, RouteValueDictionary constraints, RouteValueDictionary dataTokens, IRouteHandler routeHandler = null)
            : base(url, new RouteValueDictionary(defaults), constraints, dataTokens, routeHandler ?? new MvcRouteHandler())
        {
            this.Domain = domain;
        }

        /// <summary>
        /// 获取或设置域名地址。
        /// </summary>
        public string Domain { get; set; }

        /// <summary>
        /// 返回有关所请求路由的信息。
        /// </summary>
        /// <param name="httpContext">一个对象，封装有关 HTTP 请求的信息。</param>
        /// <returns>一个包含路由定义值的对象。</returns>
        public override RouteData GetRouteData(HttpContextBase httpContext)
        {
            if (this.Domain == null || httpContext.Request.Url.DnsSafeHost.IsMatched(this.Domain))
                return base.GetRouteData(httpContext);
            return null;
        }
    }
}